package org.wdcode.common.codec;

import javax.crypto.Cipher;

import org.wdcode.common.constants.EncryptConstants;
import org.wdcode.common.params.WdCommonParams;
import org.wdcode.common.util.StringUtil;

/**
 * 解密类
 * @author WD
 * @since JDK6
 * @version 1.0 2010-06-22
 */
public final class Decrypt extends BaseCrypt {

	/**
	 * 解密字符串
	 * @param text 要解密的字符串
	 * @return 解密后的字符串
	 */
	public final static String decrypt(String text) {
		// 判断解密方式
		if (EncryptConstants.ALGO_AES.equals(WdCommonParams.getEncryptAlgo())) {
			// AES解密
			return aes(text);
		} else if (EncryptConstants.ALGO_DES.equals(WdCommonParams.getEncryptAlgo())) {
			// DES解密
			return des(text);
		} else if (EncryptConstants.ALGO_RC2.equals(WdCommonParams.getEncryptAlgo())) {
			// RC2解密
			return rc2(text);
		} else if (EncryptConstants.ALGO_RC4.equals(WdCommonParams.getEncryptAlgo())) {
			// RC4解密
			return rc4(text);
		}
		// 默认返回AES
		return aes(text);
	}

	/**
	 * 针对encode方法的解密 DES算法
	 * @param text 需要解密的字符串
	 * @return 返回解密后的字符串 text为空或发生异常返回原串
	 */
	public final static String des(String text) {
		return decrypt(text, KEY, 0, DES_LENGTH, EncryptConstants.ALGO_DES);
	}

	/**
	 * 针对encrypt方法的解密 AES算法
	 * @param text 需要解密的字符串
	 * @return 返回解密后的字符串 text为空或发生异常返回原串
	 */
	public final static String aes(String text) {
		return decrypt(text, KEY, 0, AES_LENGTH, EncryptConstants.ALGO_AES);
	}

	/**
	 * 针对encrypt方法的解密 RC2算法
	 * @param text 需要解密的字符串
	 * @return 返回解密后的字符串 text为空或发生异常返回原串
	 */
	public final static String rc2(String text) {
		return decrypt(text, KEY, 0, RC2_LENGTH, EncryptConstants.ALGO_RC2);
	}

	/**
	 * 针对encrypt方法的解密 RC4算法
	 * @param text 需要解密的字符串
	 * @return 返回解密后的字符串 text为空或发生异常返回原串
	 */
	public final static String rc4(String text) {
		return decrypt(text, KEY, 0, RC4_LENGTH, EncryptConstants.ALGO_RC4);
	}

	/**
	 * 解密字符串
	 * @param text 要解密的字符串
	 * @param key 解密密钥Key 长度有限制 DSE 为8位 ASE 为16位
	 * @param offset 偏移从第几位开始
	 * @param len 长度一共几位
	 * @param algorithm 算法
	 * @return 解密后的字符串
	 */
	private static String decrypt(String text, byte[] key, int offset, int len, String algorithm) {
		return StringUtil.toString(doFinal(Decode.hex(text), key, offset, len, algorithm, Cipher.DECRYPT_MODE));
	}

	/**
	 * 私有构造
	 */
	private Decrypt() {}
}
